package cn.kgc.spring.day0402.aspect;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

/**
 * @author 课工场
 * @date 2024/11/7
 * @description
 */
@Component
@Aspect    //  标识当前类时通知类
public class TimeAspect {

    // 定义公共的切点表达式
    // @Pointcut("execution(*  cn.kgc.spring.day0402.service.impl.TeacherServiceImpl.teach*(..))")
    @Pointcut("@annotation(cn.kgc.spring.day0402.annotations.Time)")
    public void  pointCut(){}

    @Before("pointCut()")
    public void beforeAdvice(){
        System.out.println("上课时间到了,请开始上课....");
    }


    // 后置通知   目标方法正确执行后
    // @AfterReturning("execution(*  cn.kgc.spring.day0402.service.impl.TeacherServiceImpl.teach*(..))")
    public void  afterRetuningAdvice(){
        System.out.println("下课时间到了,请准时下课...");
    }


    // 最终通知   不管目标方法是都抛出异常都要执行的通知
    // @After("execution(*  cn.kgc.spring.day0402.service.impl.TeacherServiceImpl.teach*(..))")
    public void  afterAdvice(){
        System.out.println("-----最终通知----");
    }


    // 异常通知  目标方法在执行的过程中出现异常
    // @AfterThrowing("execution(*  cn.kgc.spring.day0402.service.impl.TeacherServiceImpl.teach*(..))")
    public void  afterThrowingAdvice(){
        System.out.println("-----异常通知----");
    }


    // 环绕通知
    // @Around("pointCut()")
    public Object  aroundAdvice(ProceedingJoinPoint joinPoint){

        // 目标方法的执行
        Object proceed = null;
        try {
            System.out.println("上课时间到了");
            proceed = joinPoint.proceed();
            System.out.println("下课时间到了");
        } catch (Throwable e) {
            System.out.println("出现异常了,异常通知");
        }finally {
            System.out.println("---最终通知-----");
        }

        return  proceed;
    }


}
